24274
24028
To pytanie ma już odpowiedzi tutaj:
Brak niejawnej konwersji w przeciążonym operatorze
(2 odpowiedzi)
Zamknięte 7 lat temu.
Piszę proste opakowanie dla typu elementarnego i staram się uniknąć konieczności pisania zbyt wielu rodzajów standardowych operatorów. Miałem nadzieję, że niejawna konwersja typów pomoże, ale tak nie jest. Oto uproszczony przykład:
struct Int
{
int _i;
Int (int i = 0): _i {i} {}
Operator int + (const Int & rhs) {return _i + rhs._i;}
};
int main (int argc, char * argv [])
{
(nieważne) (Int (1) + 2); // W porządku
(nieważne) (2 + Int (1)); // błąd: nieprawidłowe operandy w wyrażeniu binarnym („int” i „Int”)
}
Używam llvm. Pierwsza linia głównej kompilacji dobrze się kompiluje. Drugi powoduje błąd. Teraz miałem nadzieję, że wydarzy się w drugiej linii, że 2 zostanie niejawnie przekonwertowane na Int (2), po czym nastąpi wywołanie operatora +. Dlaczego tak się nie dzieje? Dlaczego niejawna konwersja ma miejsce w pierwszym wierszu? 
Dzieje się to w pierwszym wierszu, ponieważ jedynym dostępnym operatorem + jest operator + (Int &) (który ma niejawny pierwszy parametr Int dla tego wystąpienia). Druga linia kończy się niepowodzeniem, ponieważ pierwszy parametr to int i nie ma pojęcia, że ​​musi go przekonwertować przed próbą wykonania operacji (nie wie, że musi użyć Int :: operator +).
Możesz uniknąć tego problemu, czyniąc z operatora funkcję przyjaciela niebędącego członkiem (http://ideone.com/YCf7wX)
struct Int
{
int _i;
Int (int i = 0): _i {i} {}
przyjaciel Operator Int + (const Int & lhs, const Int & rhs);
};
Operator int + (const Int & lhs, const Int & rhs)
{
return lhs._i + rhs._i;
}
int main ()
{
Int i;
i + 5;
5 + i;
return 0;
}
|
Nie szukasz odpowiedzi? Przejrzyj inne pytania oznaczone tagiem c ++ operator-słowo kluczowe niejawna konwersja lub zadaj własne pytanie.